/**
 * @author: dn-jinmin/dn-jinmin
 * @doc:
 */

package websocket

import "time"

// ServerOptions 定义了配置WebSocket服务器的选项。
// 这些选项允许在创建服务器实例时自定义其行为。
type ServerOptions func(opt *serverOption)

// serverOption 包含WebSocket服务器的配置选项。
// 它定义了服务器的各种行为和限制，例如认证方式、ACK类型和最大空闲连接时间等。
type serverOption struct {
	Authentication

	ack        AckType
	ackTimeout time.Duration

	patten string

	maxConnectionIdle time.Duration

	concurrency int
}

// newServerOptions 创建并返回一个serverOption实例，该实例应用了给定的配置选项。
// 此函数使用默认值初始化serverOption，并根据传入的ServerOptions函数列表对默认配置进行修改。
func newServerOptions(opts ...ServerOptions) serverOption {
	o := serverOption{
		Authentication:    new(authentication),
		maxConnectionIdle: defaultMaxConnectionIdle,
		ackTimeout:        defaultAckTimeout,
		patten:            "/ws",
		concurrency:       defaultConcurrency,
	}

	for _, opt := range opts {
		opt(&o)
	}
	return o
}

// WithServerAuthentication 允许设置服务器的认证方式。
// 此函数返回一个ServerOptions，用于在创建服务器时应用自定义认证。
func WithServerAuthentication(auth Authentication) ServerOptions {
	return func(opt *serverOption) {
		opt.Authentication = auth
	}
}

// WithServerPatten 允许设置服务器的路由模式。
// 此函数返回一个ServerOptions，用于在创建服务器时应用自定义路由模式。
func WithServerPatten(patten string) ServerOptions {
	return func(opt *serverOption) {
		opt.patten = patten
	}
}

// WithServerAck 允许设置服务器的ACK类型。
// 此函数返回一个ServerOptions，用于在创建服务器时应用自定义ACK类型。
func WithServerAck(ack AckType) ServerOptions {
	return func(opt *serverOption) {
		opt.ack = ack
	}
}

// WithServerMaxConnectionIdle 允许设置服务器的最大空闲连接时间。
// 如果传入的时间大于0，则此函数返回一个ServerOptions，用于在创建服务器时应用自定义的最大空闲连接时间。
func WithServerMaxConnectionIdle(maxConnectionIdle time.Duration) ServerOptions {
	return func(opt *serverOption) {
		if maxConnectionIdle > 0 {
			opt.maxConnectionIdle = maxConnectionIdle
		}
	}
}
